﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ASPPanificadora.classes;
using ASPPanificadora.controller;
using System.Data;
using ASPPanificadora.Funcoes;

namespace ASPPanificadora.Telas
{
    public partial class ProdutoProducaoView : System.Web.UI.Page
    {
        IProdutoController produtoController;
        Producao producao;
        IList<Produto> produtos;
        IList<Produto> insumos;
        IList<ItemProducao> listaItemProducao;
        DataTable dadosProducao = new DataTable();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["TipoUsuario"] == null || !ControleAcessoTela.ConfirmaAcessoTela("ProdutoProducaoView", Session["TipoUsuario"]))
                Response.Redirect("~/Default.aspx");

            ((SiteCadastro)Page.Master).btnSalvar.Click += new EventHandler(Salvar);
            ((SiteCadastro)Page.Master).btnPesquisa.Click += new EventHandler(Pesquisar);
            ((SiteCadastro)Page.Master).btnLimpar.Click += new EventHandler(LimparCampos);

            if (!IsPostBack)
            {
                Session.Add("ListaItemProducao", null);
                produtoController = new ProdutoController();
                produtos = produtoController.RecuperarNaoProducao();

                ddlListaProduto.Items.Add(new ListItem("Selecione", "0"));
                ddlListaProdutoAdicionar.Items.Add(new ListItem("Selecione Produto Acima", "0"));

                foreach (Produto produto in produtos)
                {
                    ddlListaProduto.Items.Add(new ListItem(produto.NomeProduto, produto.Id.ToString()));
                }
            }

            dadosProducao.Columns.Add(new DataColumn("Produto", typeof(string)));
            dadosProducao.Columns.Add(new DataColumn("Qtde", typeof(decimal)));
            dadosProducao.Columns.Add(new DataColumn("IdProduto", typeof(Int32)));
        }

        protected void ExibeMensagem(string msg)
        {
            ((SiteCadastro)Page.Master).txtResultado.Text = msg;
        }

        protected void btnAdicionar_Click(object sender, EventArgs e)
        {
            DataRow dr;
            if (ddlListaProdutoAdicionar != null && ddlListaProdutoAdicionar.SelectedIndex != 0 && txtQtdeAdicionar.Text != null && !txtQtdeAdicionar.Text.Equals(""))
            {
                double quantitade = 0;
                if (Double.TryParse(txtQtdeAdicionar.Text, out quantitade))
                {
                    ItemProducao item = new ItemProducao();
                    Produto produto = new Produto();
                    produto.Id = Convert.ToInt32(ddlListaProdutoAdicionar.SelectedValue.ToString());
                    produto.NomeProduto = ddlListaProdutoAdicionar.SelectedItem.Text;
                    item.Produto = produto;
                    item.Qtde = quantitade;
                    item.IdProduto = produto.Id;
                    item.IdProducao = Convert.ToInt32(txtCodigo.Text);

                    if (Session["ListaItemProducao"] != null)
                        listaItemProducao = (List<ItemProducao>)Session["ListaItemProducao"];
                    else
                    {
                        Session.Add("ListaItemProducao", null);
                        listaItemProducao = new List<ItemProducao>();
                    }
                    listaItemProducao.Add(item);
                    Session["ListaItemProducao"] = listaItemProducao;
                    ddlListaProdutoAdicionar.Items.RemoveAt(Convert.ToInt32(ddlListaProdutoAdicionar.SelectedIndex));
                    ddlListaProdutoAdicionar.SelectedIndex = 0;
                    txtQtdeAdicionar.Text = null;

                    foreach (var itemPedido in listaItemProducao)
                    {
                        dr = dadosProducao.NewRow();
                        dr[0] = itemPedido.Produto.NomeProduto;
                        dr[1] = itemPedido.Qtde;
                        dr[2] = itemPedido.IdProduto;

                        dadosProducao.Rows.Add(dr);
                    }

                    dtlItemProducao.DataSource = dadosProducao;
                    dtlItemProducao.DataBind();
                    ExibeMensagem(string.Empty);
                }
            }

        }

        protected void Salvar(object sender, EventArgs e)
        {
            if (ValidaCampos())
            {
                string msg = "";
                try
                {
                    listaItemProducao = (List<ItemProducao>)Session["ListaItemProducao"];
                    producao = new Producao();
                    producao.Id = Convert.ToInt32(txtCodigo.Text);
                    producao.IdProduto = Convert.ToInt32(ddlListaProduto.SelectedValue);
                    producao.ListaItemProducao = listaItemProducao;

                    produtoController = new ProdutoController();

                    msg = produtoController.SalvarProducao(producao);
                    txtCodigo.Text = producao.Id.ToString();
                }
                catch (Exception ex)
                {
                    msg = "Erro: " + ex.Message.ToString();
                }
                finally
                {
                    ((SiteCadastro)Page.Master).txtPesquisaCodigo.Text = null;
                    ExibeMensagem(msg);
                }
            }
        }

        protected void Pesquisar(object sender, EventArgs e)
        {
            LimparCampos(sender, e);
            if (!ValidaCamposPesquisa())
            {
                try
                {
                    int id = Convert.ToInt32(((SiteCadastro)Page.Master).txtPesquisaCodigo.Text);

                    produtoController = new ProdutoController();
                    producao = produtoController.PesquisaPorIdProducao(id);

                    if (producao != null)
                    {
                        RedefinirCampos();
                    }
                }
                catch (Exception ex)
                {
                    ExibeMensagem(ex.ToString());
                }
            }
        }

        protected void LimparCampos(object sender, EventArgs e)
        {
            txtCodigo.Text = "0";

            Session["ListaItemProducao"] = null;
            produtoController = new ProdutoController();
            produtos = produtoController.RecuperarNaoProducao();
            ddlListaProduto.Items.Clear();
            ddlListaProduto.Items.Add(new ListItem("Selecione", "0"));
            ddlListaProdutoAdicionar.Items.Clear();
            ddlListaProdutoAdicionar.Items.Add(new ListItem("Selecione Produto Acima", "0"));

            foreach (Produto produto in produtos)
            {
                ddlListaProduto.Items.Add(new ListItem(produto.NomeProduto, produto.Id.ToString()));
            }
            txtQtdeAdicionar.Text = null;
            ddlListaProduto.SelectedIndex = 0;
            ddlListaProdutoAdicionar.SelectedIndex = 0;
            dtlItemProducao.DataSource = null;
            dtlItemProducao.DataBind();
            ddlListaProduto.Enabled = true;
            ExibeMensagem(string.Empty);
        }

        protected void ddlListaProduto_SelectedIndexChanged(object sender, EventArgs e)
        {
            AtualizaDDLListaProdutoAdicionar();
            ddlListaProduto.Enabled = false;
        }

        private bool ValidaCamposPesquisa()
        {
            if (((SiteCadastro)Page.Master).txtPesquisaCodigo == null || ((SiteCadastro)Page.Master).txtPesquisaCodigo.Text.Equals("") || ((SiteCadastro)Page.Master).txtPesquisaCodigo.Text.Equals("0"))
                return true;
            else
                return false;
        }

        protected void dtlItemProducao_ItemCommand(object source, DataListCommandEventArgs e)
        {
            if (Session["ListaItemProducao"] != null)
            {
                listaItemProducao = (List<ItemProducao>)Session["ListaItemProducao"];

                if (e.CommandName.Equals("Excluir"))
                {
                    int idProduto = Convert.ToInt32(e.CommandArgument);

                    ItemProducao item = listaItemProducao.Where(a => a.IdProduto == idProduto).FirstOrDefault();
                    if (item != null)
                    {
                        listaItemProducao.Remove(item);
                        List<int> idSelecionados = new List<int>();
                        foreach (ItemProducao itemProducao in listaItemProducao)
                        {
                            idSelecionados.Add(itemProducao.IdProduto);
                        }
                        AtualizaDDLListaProdutoAdicionar(idSelecionados);
                    }
                }
                Session["ListaItemProducao"] = listaItemProducao;

                DataRow dr;
                dadosProducao.Clear();
                foreach (var itemPedido in listaItemProducao)
                {
                    dr = dadosProducao.NewRow();
                    dr[0] = itemPedido.Produto.NomeProduto;
                    dr[1] = itemPedido.Qtde;
                    dr[2] = itemPedido.IdProduto;

                    dadosProducao.Rows.Add(dr);
                }

                dtlItemProducao.DataSource = dadosProducao;
                dtlItemProducao.DataBind();
            }
            ExibeMensagem(string.Empty);
            udpListaProdutoAdicionar.Update();
        }

        private void AtualizaDDLListaProdutoAdicionar(List<int> idSelecionados = null, int codigoProducao = 0)
        {
            produtoController = new ProdutoController();
            if(idSelecionados != null && idSelecionados.Count > 0)
                insumos = produtoController.RecuperarNaoInsumoAtualiza(idSelecionados, Convert.ToInt32(ddlListaProduto.SelectedValue));
            else if(codigoProducao != 0)
                insumos = produtoController.RecuperarNaoInsumo(codigoProducao);
            else
                insumos = produtoController.RecuperarNaoInsumo(Convert.ToInt32(ddlListaProduto.SelectedValue));

            ddlListaProdutoAdicionar.Items.Clear();
            ddlListaProdutoAdicionar.Items.Add(new ListItem("Selecione", "0"));

            foreach (Produto produto in insumos)
            {
                ddlListaProdutoAdicionar.Items.Add(new ListItem(produto.NomeProduto, produto.Id.ToString()));
            }

            udpListaProdutoAdicionar.Update();
        }

        private bool ValidaCampos()
        {
            if (ddlListaProduto.SelectedIndex == 0)
                return false;
            else if (Session["ListaItemProducao"] == null || ((List<ItemProducao>)Session["ListaItemProducao"]).Count == 0)
                return false;
            else
                return true;
        }

        private void RedefinirCampos()
        {
            if (producao != null && producao.Id != 0)
            {
                ((SiteCadastro)Page.Master).txtPesquisaCodigo.Text = null;
                ((SiteCadastro)Page.Master).txtResultado.Text = null;
                txtCodigo.Text = producao.Id.ToString();
                ddlListaProduto.Items.Clear();
                ddlListaProduto.Items.Add(new ListItem("Selecione", "0"));
                ddlListaProduto.Items.Add(new ListItem(producao.Produto.NomeProduto,producao.IdProduto.ToString()));
                ddlListaProduto.SelectedIndex = 1;
                if (Session["ListaItemProducao"] == null)
                    Session.Add("ListaItemProducao", producao.ListaItemProducao);
                else
                    Session["ListaItemProducao"] = producao.ListaItemProducao;

                listaItemProducao = producao.ListaItemProducao;
                DataRow dr;
                dadosProducao.Clear();
                foreach (var itemPedido in listaItemProducao)
                {
                    dr = dadosProducao.NewRow();
                    dr[0] = itemPedido.Produto.NomeProduto;
                    dr[1] = itemPedido.Qtde;
                    dr[2] = itemPedido.IdProduto;

                    dadosProducao.Rows.Add(dr);
                }

                dtlItemProducao.DataSource = dadosProducao;
                dtlItemProducao.DataBind();

                List<int> idSelecionados = new List<int>();
                foreach (ItemProducao itemProducao in listaItemProducao)
                {
                    idSelecionados.Add(itemProducao.IdProduto);
                }
                AtualizaDDLListaProdutoAdicionar(idSelecionados);
                ddlListaProduto.Enabled = false;
            }
        }
    }
}